import router from "../router";
// 判断本地有没有token 本地存储的get方法
import * as storage from "../utils/storage";
//
import store from "../store";
import { SET_USER } from "../store/types";
// 页面权限 获取白名单方法
import { getWhiteList } from "../api";

// 按钮级权限：自定义指令文件
import "./directive";

import { Message } from "element-ui";

// 白名单 存放 允许对用户开放的页面
const whiteList = ["/login"];
// 路由守卫 ：每次路由跳转之前 就会进入到路由守卫里面
router.beforeEach(async (to, from, next) => {
  // 所有的用户都可以访问登录页
  if (whiteList.includes(to.path)) {
    return next();
  }
  //只有登录用户 才能访问 除了白名单 之外的页面
  //  登录用户的条件 ：1.本地一定要有token 2.检测token是否何方或者未过期（结合后端：接口：get方式访问/user接口）
  if (!storage.get("z-admin-token")) {
    return next("/login");
  }
  // 如果触发了SET_USER 这个事件
  try {
    await store.dispatch(SET_USER);
  } catch (e) {
    if (e.status === 5000) {
      return next(from.path); // 跳转到之前的页面
    }
    return next("/login");
  }

  if (to.path === "/dashboard" || to.path === "/") {
    return next();
  }

  // 页面权限 不同的用户访问的页面也不同
  // 检测 要跳转的地址是不是当前用户可以访问的
  // 原理： 从后端（接口：/admin/menu）获取一个白名单，白名单中记录了当前的登录用户能访问的url，每一次路由跳转我们都进行比对，
  // 看一看用户要跳转的地址在不在这个白名单中，在就放行。
  const menu = await getWhiteList();
  const flag = menu.some((menu) => to.path === menu.path);
  if (!flag) {
    Message.warning("这个页面不是你能访问的！！！");
    return next(from.path);
  }

  next();
  //   按钮级权限  ：
  //  使用自定义指令: v-permission = ['管理员','超级管理员'] // 只有数组中的成员允许
  // 需要获取用户对应的身份 接口：/user
});
